•  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
[주의!] 문서의 이전 버전(에 수정)을 보고 있습니다. 최신 버전으로 이동
이 문서는 분류가 되어 있지 않습니다. 분류:분류에서 적절한 분류를 찾아 문서를 분류해주세요!
1. 개요2. 공통 점검 내역3. LSM/ADC 서버 점검 내역 4. VOD 서버 점검 내역 5. 스크립트 본문 및 사용 방법

1. 개요 [편집]

KT GTV 서버 환경점검을 위해 사용하는 스크립트이다.
공통 점검 내역은 동일하게 수행하나 LSM/ADC 서버와 VOD 서버 역할이 달라 점검내용이 다른 부분이 있다.

2. 공통 점검 내역 [편집]

1. HW 모델명 확인
2. HDD 및 RAID 구성, 상태 점검
3. 시스템 로그 점검
4. NIC 사용 현황 점검
5. Bond 및 IP 설정 점검
6. Routing 점검
7. OS 버전 점검
8. OS Disk 용량 점검
9. /data Disk 용량 점검
10. 시간동기화 점검
11. GateWay Ping 점검
12. 서버 부팅 관련 설정파일 점검
13. 프로세스 서비스 이중화 상태 점검
14. 프로세스 포트 및 상태 점검
15. CPU 사용률 점검

3. LSM/ADC 서버 점검 내역 [편집]

1. LBAdmin 상태 점검
2. LFMServer 로그 점검
3. LFMSinkModule 로그 점검
4. CiGLBServer 로그 점검
5. L_ADS 로그 점검
6. ADSController 로그 점검
7. ADSClient 로그 점검
8. LoadBalancer2 로그 점검

4. VOD 서버 점검 내역 [편집]

1. CIHVODServer 로그 점검

5. 스크립트 본문 및 사용 방법 [편집]

 ## 사용법 ## 
1. 아래 스크립트를 복사해 서버에 .sh 파일로 만들어 준다.
# vim Server_Check.sh
2. 스크립트 실행 권한을 부여 한다.
# chmod +x Server_Check.sh
3. 스크립트 수행 시 숫자 7과 해당 서버를 명시한다.
LSM 서버일 경우
# ./Server_Check.sh 7 LSM
ADC 서버일 경우
# ./Server_Check.sh 7 ADC
VOD 서버일 경우
# ./Server_Check.sh 7 VOD


#!/bin/bash
# -*- coding : UTF-8 -*-
# version : 1.0.0
# create date : 2021-11-18
# update date : 2025-02-10
# ----------------------------------------------
# Copyright (c) 2021
# @author mir kim
# Server_Check.sh

scriptName="Server_Check.sh"
scriptVersion="20250210"
check_failures=""
output_file="/home/castis/output_data_$(date +'%Y-%m-%d_%H-%M').txt"
ENV=$(env | grep LANG)

manPage="""
SYNOPSIS
./Server_Check.sh [?|-h]

This script works as follows.
1. H/W 점검 결과 추출
2. Network 상태 점검 결과 추출
3. OS 상태 점검 결과 추출
4. 이중화 점검 결과 추출
5. 서비스 현황 점검 결과 추출
6. 종합의견 결과 추출
7. JSON 형식으로 반환

함수 Make_Json_List() parameter

ex) Make_Json_List 생성유형 \"점검항목 큰 제목\" \"점검항목\" \"점검기준 값\" \"상세 점검 방법\" \"점검 결과 값\" \"양호/불량\"

OPTIONS
? or -h
Show this help message and exit

"""

#local functions start
ServerName=$(hostname)

# 점검 결과 Result
Success="양호"
Fail="불량"

# server model
Server_Product=$(dmidecode | grep Prod | head -1 | cut -d : -f2 | awk '{print $1, $2, $3, $4}')

function f_Usage() {
echo "$manPage"
}

Item_Num=1

function Make_Json_List() {
# echo "DEBUG: 매개변수 -> $1 | $2 | $3 | $4 | $5 | $6"
case $1 in
First_Start)
echo -e "--------------------------------------------"
echo -e "점검 내용 : $3"
echo -e "결과: $5"
echo -e "상태: $6"
echo -e "--------------------------------------------"
;;
Start)
echo -e "점검 내용 : $3"
echo -e "결과: $5"
echo -e "상태: $6"
echo -e "--------------------------------------------"
;;
Middle)
echo -e "점검 내용 : $3"
echo -e "결과: $5"
echo -e "상태: $6"
echo -e "--------------------------------------------"
;;
End)
echo -e "점검 내용 : $3"
echo -e "결과: $5"
echo -e "상태: $6"
echo -e "--------------------------------------------"
;;
First_Single)
echo -e "점검 내용 : $3"
echo -e "결과: $5"
echo -e "상태: $6"
echo -e "--------------------------------------------"
;;
Single)
echo -e "점검 내용 : $3"
echo -e "결과: $5"
echo -e "상태: $6"
echo -e "--------------------------------------------"
;;
esac
}

# H/W 점검 결과 추출
function HW_Check() {
# [ H/W 모델명 확인 ]
Make_Json_List First_Start "HardwareCheck" "H/W 모델명. 확인" "육안확인 결과" "dmidecode | grep 'Product Name'" "$(dmidecode | grep "Product Name" | head -1 | cut -d : -f2 | awk '{print $1, $2, $3, $4}')" "$Success"

# [ HDD 용량 및 RAID 구성 점검]

# Dell 서버
if [[ $Server_Product =~ "PowerEdge" ]]; then

battery_status=$(omreport storage battery | grep "Status" | grep -v Ok)
disk_status=$(omreport storage pdisk controller=0 | grep "Power Status" -v | grep -w Status | grep -v Ok)

if [ -n "$battery_status" ] || [ -n "$disk_status" ]; then
Make_Json_List Middle "" "Dell HDD상태 및 RAID 구성 점검" "Fail 또는 Error 있음" "omreport storage battery" "DISK, cache_battery 점검필요" "$Fail"
else
Make_Json_List Middle "" "Dell HDD상태 및 RAID 구성 점검" "Fail 또는 Error 없음" "omreport storage pdisk controller=0" "이상없음" "$Success"
fi

# Gen9 서버
elif [[ $Server_Product =~ "Gen9" ]]; then
HP="hpssacli"

# Gen10 서버
elif [[ $Server_Product =~ "Gen10" ]]; then
HP="ssacli"

# G8 이하 버전 HP 서버
else
HP="hpacucli"
fi # 여기서 if 문을 닫습니다.

# HP 서버
if [ ! -z $HP ]; then

cache_battery_status=$($HP ctrl all show config detail | egrep -i "Cache Status|controller status" | grep -i "Failed")

for list in logicaldrive physicaldrive; do
drive_check=$($HP ctrl all show config detail | grep -i "failed")
case $? in
0)
drive_check+=(${list})
;;
esac
done

if [ -n "$drive_check" ] || [ -n "$cache_battery_status" ]; then
Make_Json_List Middle "" "HPE HDD 상태 및 RAID 구성 점검" "Fail 또는 Error 있음" "$HP ctrl all show detail" "DISK 또는 cache_battery 상태 점검필요" "$Fail"
else
Make_Json_List Middle "" "HPE HDD 상태 및 RAID 구성 점검" "Fail 또는 Error 없음" "$HP ctrl all show detail" "이상없음" "$Success"
fi
fi

# [ 시스템 로그 점검]
Syslog=$(grep -im 11 error /var/log/messages | egrep -vc "L2 Error|drive_cmd")
if [ $Syslog -le 10 ]; then
Make_Json_List Middle "" "시스템 로그 점검" "에러 없음" "grep -i Error /var/log/messages" "이상없음" "$Success"
else
Make_Json_List Middle "" "시스템 로그 점검" "에러 없음" "grep -i Error /var/log/messages" "점검필요" "$Fail"
fi
}

# Network 상태 점검 결과 추출
function Network_Check() {

# [ NIC 사용 현황]
OS_Version=$(awk '{print $(NF-1)}' /etc/redhat-release)
USE_Bond=$(ls -al /etc/sysconfig/network-scripts/ifcfg-bond* | egrep -w "ifcfg-bond0$|ifcfg-bond1$|ifcfg-bond2quot; -c 2>/dev/null)

case $OS_Version in

6.4 | 6.6 | 6.9)
Alias=$(grep -c 'alias bond' /etc/modprobe.d/bonding.conf)
;;

5 | 5.4 | 5.7)
Alias=$(grep -c 'alias bond' /etc/modprobe.conf)
;;

7.5.1804)
Alias=$(echo $USE_Bond)
;;
esac

case $USE_Bond in

$Alias)
Make_Json_List Start "NetworkCheck" "NIC 사용 현황" "-" "ethtool ethX\\\ncat /etc/modprobe.conf\\\ncat /etc/modprobe.d/bonding.conf" "이상없음" "$Success"
;;
*)
Make_Json_List Start "NetworkCheck" "NIC 사용 현황" "-" "ethtool ethX\\\ncat /etc/modprobe.conf\\\ncat /etc/modprobe.d/bonding.conf" "점검필요" "$Fail"
;;
esac

# [ IP 설정 확인]

# vpc 사용 여부
ip addr show vpcmanage >/dev/null 2>/dev/null

case $? in

0)
Manage_IP=$(ip addr show vpcmanage | grep -w "inet" | cut -d'/' -f1 | awk '{ print $2 }')
Service_IP=$(ip addr show vpcservice | grep -w "inet" | cut -d'/' -f1 | awk '{ print $2 }')

Make_Json_List Middle "" "IP 설정 확인" "-" "ifconfig 명령으로 IP 설정 확인" "$Manage_IP\\\n$Service_IP" "$Success"
;;
*)
# bond2 사용 여부
ip addr show bond2 >/dev/null 2>/dev/null

case $? in

0)
Manage_IP=$(ip addr show bond0 | grep -w "inet" | cut -d'/' -f1 | awk '{ print $2 }' | head -1)
Service1_IP=$(ip addr show bond1 | grep -w "inet" | cut -d'/' -f1 | awk '{ print $2 }' | head -1)
Service2_IP=$(ip addr show bond2 | grep -w "inet" | cut -d'/' -f1 | awk '{ print $2 }' | head -1)

Make_Json_List Middle "" "IP 설정 확인" "-" "ifconfig 명령으로 IP 설정 확인" "Manage_IP: $Manage_IP, Service1_IP: $Service1_IP, Service2_IP : $Service2_IP" "$Success"
;;
*)
Manage_IP=$(ip addr show bond0 | grep -w "inet" | cut -d'/' -f1 | awk '{ print $2 }' | head -1)
Service_IP=$(ip addr show bond1 | grep -w "inet" | cut -d'/' -f1 | awk '{ print $2 }' | head -1)

Make_Json_List Middle "" "IP 설정 확인" "-" "ifconfig 명령으로 IP 설정 확인" "$Manage_IP: $Manage_IP, Service_IP: $Service_IP" "$Success"

;;
esac
;;
esac

# 관리 및 서비스 네트워크 Link 상태 점검
for list in $(grep "ONBOOT=yes" /etc/sysconfig/network-scripts/ifcfg-bond[0-9] | awk -F'ifcfg-' '{ split($2,arr,":"); print arr[1] }'); do
case $list in
bond1)
# 후지쯔 서버
if [[ $Server_Product =~ "PRIMERGY" ]]; then

NIC_Fail_Cnt=$(grep "$Active_NIC" /proc/net/bonding/bond1 -A 2 | grep Count | cut -d : -f2 | awk '{ if ( $1 >= 100 ){print}}' | wc -l)
Active_NIC=$(grep "MASTER_SLAVE" /usr/local/castis/bfod/bfod.cfg | awk -F'=' '{ print $NF }')
grep "$Active_NIC" /proc/net/bonding/${list} -A 2 | grep "Status" | grep -vq "up"
Link_Status=$?
else

NIC_Fail_Cnt=$(grep Count /proc/net/bonding/$list | cut -d : -f2 | awk '{ if ( $1 >= 100 ){print}}' | wc -l)
grep "Status" /proc/net/bonding/${list} | grep -vq "up"
Link_Status=$?
fi
;;

*)
NIC_Fail_Cnt=$(grep Count /proc/net/bonding/$list | cut -d : -f2 | awk '{ if ( $1 >= 100 ){print}}' | wc -l)
grep "Status" /proc/net/bonding/${list} | grep -vq "up"
Link_Status=$?
;;
esac
done

# [ Routing 설정 점검]

#bond2 존재 여부
src_Cnt=$(ip route show | grep "src" | wc -l)
Static_IP_Cnt=$(grep "IPADDR" /etc/sysconfig/network-scripts/ifcfg-* | egrep -v "#|127.0.0.1" | wc -l)
case $src_Cnt in
$Static_IP_Cnt)
Make_Json_List End "" "Routing 설정 점검" "" "route -n routing 정보 확인" "이상없음" "$Success"
;;
*)
Make_Json_List End "" "Routing 설정 점검" "" "route -n routing 정보 확인" "점검필요" "$Fail"
;;
esac
}

# OS 상태 점검 결과 추출
function OS_Check() {

OS_Limit_Space=70
L_Data_Limit_Space=90
V_Data_Limit_Space=92

# [ OS/Kerne 버전 ]

OS_Version=$(awk -F 'release' '{ print $2 }' /etc/redhat-release | awk '{ print $(NF-1) }')
Make_Json_List Start "OSCheck" "OS/Kernel 버전" "-" "cat /etc/redhat-release\\\n uname -a" "$OS_Version" "$Success"

# [ OS_디스크 용량 점검]
OS_Free_Space=$(df -h | grep -w "/" | awk '{ print $(NF-1) }' | cut -d'%' -f1)
if [ $OS_Free_Space -lt $OS_Limit_Space ]; then

Make_Json_List Middle "" "OS 디스크 용량 점검 - ( 마운트위치: / )" "${OS_Limit_Space}% 미만" "df -h 명령으로 / 의 사용률 확인" "이상없음" "$Success"
else
Make_Json_List Middle "" "OS 디스크 용량 점검 - ( 마운트위치: / )" "${OS_Limit_Space}% 미만" "df -h 명령으로 / 의 사용률 확인" "점검필요" "$Fail"
fi

# [ 스토리지_디스크 용량 점검]
Data_Fail_Cnt=0
case $1 in
LSM | ADC)
for list in $(df -h | egrep "/data" | grep "%" | awk '{ print $NF }'); do

if [ $(df -h | grep -w "$list" | awk '{ print $(NF-1) }' | cut -d'%' -f1) -gt $L_Data_Limit_Space ]; then ((Data_Fail_Cnt++)); fi
done

case $Data_Fail_Cnt in
0)
Make_Json_List Middle "" "스토리지 디스크 용량 점검 - ( 마운트위치: /data? )" "${L_Data_Limit_Space}% 미만" "df -h 명령으로 각 /data?들의 사용률 확인" "이상없음" "$Success"
;;
*)
Make_Json_List Middle "" "스토리지 디스크 용량 점검 - ( 마운트위치: /data? )" "${L_Data_Limit_Space}% 미만" "df -h 명령으로 각 /data?들의 사용률 확인" "점검필요" "$Fail"
;;
esac
;;
VOD)

if df -h | egrep -q "/data"; then
for list in $(df -h | egrep "/data" | grep "%" | awk '{ print $NF }'); do
if [ $(df -h | grep -w "$list" | awk '{ print $(NF-1) }' | cut -d'%' -f1) -gt $V_Data_Limit_Space ]; then
((Data_Fail_Cnt++))
fi
done
else
# /data 디렉토리가 없으면 점검필요로 처리
Data_Fail_Cnt=1
fi

case $Data_Fail_Cnt in

0)
Make_Json_List Middle "" "스토리지 디스크 용량 점검 - ( 마운트위치: /data? )" "${V_Data_Limit_Space}% 미만" "df -h 명령으로 각 /data?들의 사용률 확인" "이상없음" "$Success"
;;
*)
Make_Json_List Middle "" "스토리지 디스크 용량 점검 - ( 마운트위치: /data? )" "${V_Data_Limit_Space}% 미만" "df -h 명령으로 각 /data?들의 사용률 확인" "점검필요" "$Fail"
;;
esac
;;
esac

# [ 시간동기화 확인]
ntpq -p | egrep -q '\+|\*'

case $? in
0)
Make_Json_List Middle "" "시간동기화 확인" "*220.73.142.71\\\n*220.73.142.73" "ntpq -p 명령으로 시간 동기화 동작 상태 확인" "이상없음" "$Success"
;;
*)
Make_Json_List Middle "" "시간동기화 확인" "*220.73.142.71\\\n*220.73.142.73" "ntpq -p 명령으로 시간 동기화 동작 상태 확인" "점검필요" "$Fail"
;;
esac

# GATEWAY PING 확인

ifconfig bond2 >/dev/null 2>/dev/null
if [ $? -eq 0 ]; then
Service_GW=($(ip route show | grep default -A 2 | grep "nexthop via" | awk -F'via ' '{ split($2,arr," "); print arr[1] }'))
Service_Interface=($(ip route show | grep default -A 2 | grep "nexthop via" | awk -F'dev ' '{ split($2,arr," "); print arr[1] }'))
else
Service_GW=($(ip route show | grep default -A 2 | grep via | awk -F'via ' '{ split($2,arr," "); print arr[1] }'))
Service_Interface=($(ip route show | grep default -A 2 | grep via | awk -F'dev ' '{ split($2,arr," "); print arr[1] }'))

fi
Service_GW_Result=0

for ((NIC_Cnt = 0; NIC_Cnt < ${#Service_GW[@]}; NIC_Cnt++)); do
ping -I ${Service_Interface[$NIC_Cnt]} ${Service_GW[$NIC_Cnt]} -c 1 >/dev/null 2>/dev/null
((Service_GW_Result = $Service_GW_Result + $?))
done

if [ $Service_GW_Result -eq 0 ]; then
Make_Json_List Middle "" "GATEWAY_PING 확인" "정상" "ping '${Service_GW[*]}' (${Service_Interface[*]})" "이상없음" "$Success"
else
Make_Json_List Middle "" "GATEWAY_PING 확인" "정상" "ping '${Service_GW[*]}' (${Service_Interface[*]})" "점검필요" "$Fail"
fi

# [ 서버 부팅 시 스크립트 권한 확인, 고성능서버 설정 확인 등 ]

sum_Result=()

#crontab (파일 권한 및 소유자 확인)
ls -l /etc/crontab | awk '{ print $1 }' | egrep -q "^-rw-"
cron_Authority=$?
ls -ltr /etc/crontab | awk '{ print $3 }' | grep -q "root"
cron_Manager=$?

if [ $cron_Authority -eq 0 ] && [ $cron_Manager -eq 0 ]; then
cron_Result=0
else
cron_Result=" cron "
fi

#sysctl.conf (파일에 해당 문자열이 있는지 확인인)
grep -wq "TCP Setting by CASTIS" /etc/sysctl.conf
sysctl_Result=$?

if [ $sysctl_Result -ne 0 ]; then sysctl_Result=" sysctl "; fi

#rc.local (심볼릭 링크 설정 확인인)
ls -ltr /etc/rc.local | egrep "^lrwx" | awk '{ print $NF }' | egrep -q "rc.d/rc.local"
rclocal_Authority=$?
if [ $rclocal_Authority -ne 0 ]; then rclocal_Authority=" rclocal_Authority "; fi

Omission_Ps=()
case $1 in
LSM | ADC)
#AD node check
echo $(hostname) | grep -wq "AD"
AD_Check=$?

case $AD_Check in
0)
rc_local_Ps=("ServiceMonitorCtl" "NetIOCtl" "CiMonitoringAgentMonitor")
;;
1)
rc_local_Ps=("ServiceMonitorCtl" "NetIOCtl" "LFMSinkModuleMonitor" "CiMonitoringAgentMonitor")
;;
esac

# share storage check
grep -q "Virtual" /usr/local/castis/LoadBalancer2.cfg
Share_Data_Result=$?

if [ $Share_Data_Result -eq 0 ]; then rc_local_Ps+=("CenterFileManagerCtl"); fi
;;
VOD)
# share storage check
grep -q "Shared_Base_Directory" /usr/local/castis/vod.cfg
Share_Data_Result=$?

rc_local_Ps=("ServiceMonitorCtl" "eStreamServer" "NetIOCtl" "ADMMonitor")
if [ $Share_Data_Result -eq 0 ]; then rc_local_Ps+=("CenterFileWorkerCtl"); fi
;;
esac

for ((PS_Cnt = 0; PS_Cnt < ${#rc_local_Ps[@]}; PS_Cnt++)); do

grep -v '#' /etc/rc.local | grep -q "${rc_local_Ps[$PS_Cnt]}"
if [ $? -ne 0 ]; then Omission_Ps+=(${rc_local_Ps[$PS_Cnt]}); fi

done

for list in $cron_Result $sysctl_Result $rclocal_Authority; do
if [ "$list" != "0" ]; then sum_Result+=($list); fi
done

if [ ! $sum_Result ] && [ ! $Omission_Ps ]; then
Make_Json_List End "" "서버 부팅 시 스크립트 설정 누락 확인, 고성능 서버 설정 확인 등" "정상" "rc.local, crontab, sysctl.conf" "이상없음" "$Success"
else
Make_Json_List End "" "서버 부팅 시 스크립트 설정 누락 확인, 고성능 서버 설정 확인 등" "정상" "rc.local, crontab, sysctl.conf" "${sum_Result[*]} ${Omission_Ps[*]} 점검필요" "$Fail"
fi
}

# 이중화 점검
function Cluster_Check() {

#[ 프로세스 이중화 테스트 점검 ]
grep -v "#" /usr/local/castis/svcmonitor.cfg | grep -q "Service1_My_Priority=0"
# Master_Cnt = 1 : backup, 0: Active
Master_Cnt=$?
VIP_Up_Fail_Cnt=0

for V_IP in $(grep "Representative_NIC" /usr/local/castis/svcmonitor.cfg | grep -v "#" | cut -d '=' -f2 | sort -u); do
ip addr show | grep -q "secondary ${V_IP}"
if [ $? -ne 0 ]; then ((VIP_Up_Fail_Cnt++)); fi
done

case $VIP_Up_Fail_Cnt in
0)
Make_Json_List Single "ClusterCheck" "프로세스 이중화 테스트 점검" "-" "LSM에서 실행 중이면 정상, ADC에서 실행중이면 절체로 판단" "이상없음" "$Success"
return 0
;;
*)
case $Master_Cnt in
0)
Make_Json_List Single "ClusterCheck" "프로세스 이중화 테스트 점검" "-" "LSM에서 실행 중이면 정상, ADC에서 실행중이면 절체로 판단" "점검필요" "$Fail"
return 1
;;
1)
Make_Json_List Single "ClusterCheck" "프로세스 이중화 테스트 점검" "-" "LSM에서 실행 중이면 정상, ADC에서 실행중이면 절체로 판단" "이상없음" "$Success"
return 1
;;
esac
;;
esac

}

# 서비스 현황 점검
Service_Solution_Status_Check() {

DAY=$(date +%F)
MONTH=$(date +%Y-%m)
EVENTLOG_DAY=$(date +%Y%m%d)
OS_Version=$(awk '{print $(NF-1)}' /etc/redhat-release)

# LSM 포트 변수 정의
LFMServer_PORT="8549"
LFMSinkModule_PORT="8550"
LoadBalancer2_PORT="50890"
ADSController_PORT="904"
ADSClient_PORT="911"
L_ADS_PORT="30000"
L_GSDM_PORT="18079"
L_NRM_PORT="18081"
file_requester_PORT="18084"
cache_manager_PORT="8081"
NetIOServer3_PORT="32128"
CiMonitoringAgent_PORT="30002"
ServiceMonitor_PORT="3511"

# VOD 포트 변수 정의
CiHVODServer_PORT="554"
ADM_PORT="40080"
ADS_PORT="30000"
NetIOServer3_PORT="32128"
cache_manager_PORT="8081"
CiMonitoringAgent_PORT="30002"

# LISTEN
LISTEN_OUTPUT=$(netstat -tnpl | awk '/LISTEN/ {split($4, a, ":"); print a[length(a)]}' | sed 's/\/.*//g')

# 누락된 항목을 저장할 변수
MISSING_ITEMS=""
ISSUES_FOUND=0

# LSM과 VOD 구분하여 점검
case $1 in
LSM)
for PORT_LSM in ServiceMonitor_PORT LFMServer_PORT LFMSinkModule_PORT LoadBalancer2_PORT ADSController_PORT ADSClient_PORT L_ADS_PORT L_GSDM_PORT L_NRM_PORT file_requester_PORT cache_manager_PORT NetIOServer3_PORT CiMonitoringAgent_PORT; do
PORT=${!PORT_LSM}
if ! echo "$LISTEN_OUTPUT" | grep -qw "$PORT"; then
MISSING_ITEMS+="$PORT_LSM($PORT), "
TEMP_MISSING_ITEMS+="$PORT_LSM($PORT) "
ISSUES_FOUND=1
printed_items[$PORT_LSM]=$PORT
fi
done
sleep 3
for PORT_LSM in ServiceMonitor_PORT LFMServer_PORT LFMSinkModule_PORT LoadBalancer2_PORT ADSController_PORT ADSClient_PORT L_ADS_PORT L_GSDM_PORT L_NRM_PORT file_requester_PORT cache_manager_PORT NetIOServer3_PORT CiMonitoringAgent_PORT; do
PORT=${!PORT_LSM}
if ! echo "$LISTEN_OUTPUT" | grep -qw "$PORT"; then
if [[ -z "${printed_items[$PORT_LSM]}" ]]; then
MISSING_ITEMS+="$PORT_LSM($PORT), "
ISSUES_FOUND=1
printed_items[$PORT_LSM]=$PORT
fi
fi
done
;;
ADC)
for PORT_LSM in ServiceMonitor_PORT NetIOServer3_PORT CiMonitoringAgent_PORT; do
PORT=${!PORT_LSM}
if ! echo "$LISTEN_OUTPUT" | grep -qw "$PORT"; then
MISSING_ITEMS+="$PORT_LSM($PORT), "
TEMP_MISSING_ITEMS+="$PORT_LSM($PORT) "
ISSUES_FOUND=1
printed_items[$PORT_LSM]=$PORT
fi
done
sleep 3
for PORT_LSM in ServiceMonitor_PORT NetIOServer3_PORT CiMonitoringAgent_PORT; do
PORT=${!PORT_LSM}
if ! echo "$LISTEN_OUTPUT" | grep -qw "$PORT"; then
if [[ -z "${printed_items[$PORT_LSM]}" ]]; then
MISSING_ITEMS+="$PORT_LSM($PORT), "
ISSUES_FOUND=1
printed_items[$PORT_LSM]=$PORT
fi
fi
done
;;
VOD)
# VOD 포트 점검
for PORT_VOD in CiHVODServer_PORT ADM_PORT ADS_PORT NetIOServer3_PORT cache_manager_PORT CiMonitoringAgent_PORT; do
PORT=${!PORT_VOD}
if ! echo "$LISTEN_OUTPUT" | grep -qw "$PORT"; then
MISSING_ITEMS+="$PORT_LSM($PORT), "
TEMP_MISSING_ITEMS+="$PORT_LSM($PORT) "
ISSUES_FOUND=1
printed_items[$PORT_LSM]=$PORT
fi
done
sleep 3
for PORT_VOD in CiHVODServer_PORT ADM_PORT ADS_PORT NetIOServer3_PORT cache_manager_PORT CiMonitoringAgent_PORT; do
PORT=${!PORT_VOD}
if ! echo "$LISTEN_OUTPUT" | grep -qw "$PORT"; then
if [[ -z "${printed_items[$PORT_LSM]}" ]]; then
MISSING_ITEMS+="$PORT_LSM($PORT), "
ISSUES_FOUND=1
printed_items[$PORT_LSM]=$PORT
fi
fi
done
;;
esac

# 결과 출력
if [ $ISSUES_FOUND -eq 0 ]; then
Make_Json_List Single "ServiceCheck" " 포트 및 프로그램 상태 확인" "모두 LISTEN 상태" "netstat 명령으로 포트 및 프로그램 확인" "이상없음" "$Success"
else
MISSING_ITEMS_STR=${MISSING_ITEMS%, }
Make_Json_List Single "ServiceCheck" " 포트 및 프로그램 상태 확인" "LISTEN 확인 실패: $MISSING_ITEMS_STR" "netstat 명령으로 포트 및 프로그램 확인" "$MISSING_ITEMS_STR 점검필요" "$Fail"
fi

# CPU 사용률 확인
VMSTAT=$(vmstat 1 3 | awk '{print $15}' | sed -n 4p)

if [ "$1" != "VOD" ] && [ $2 -ne 0 ]; then
if [ $VMSTAT -ge 30 ]; then
Make_Json_List Single "ServiceCheck" "CPU 사용률 확인" "30% 이상" "vmstat 명령으로 CPU id(idle) 확인" "이상없음" "$Success"
else
Make_Json_List Single "ServiceCheck" "CPU 사용률 확인" "30% 이상" "vmstat 명령으로 CPU id(idle) 확인" "불량" "$Fail"
fi
else
if [ $VMSTAT -ge 30 ]; then
Make_Json_List Start "ServiceCheck" "CPU 사용률 확인" "30% 이상" "vmstat 명령으로 CPU id(idle) 확인" "이상없음" "$Success"
else
Make_Json_List Start "ServiceCheck" "CPU 사용률 확인" "30% 이상" "vmstat 명령으로 CPU id(idle) 확인" "불량" "$Fail"
fi
fi

# LBADMIN 상태 확인, 로그 기반 장애 내역 점검
if [ "$1" != "VOD" ]; then

if [ $2 -eq 0 ]; then
Server_Error_Cnt=$(/usr/local/castis/tools/vodcmd all status | grep "Error" | awk '{ print $1 }' | xargs echo)
if [ -z "$Server_Error_Cnt" ]; then

Make_Json_List Middle "" "LBAdmin 상태 확인" "-" "LBAdmin에서 LB서버 상태 확인 ( Running, Pause, Error )" "이상없음" "$Success"

else
Make_Json_List Middle "" "LBAdmin 상태 확인" "-" "LBAdmin에서 LB서버 상태 확인 ( Running, Pause, Error )" "${Server_Error_Cnt} 점검필요" "$Fail"
fi

LFM_DIST_LOG1=0
LFM_DIST_LOG2=0
GLB_LIMIT="30"
LB_EVENT_LIMIT="30"
LB_CI_LIMIT="30"
LFM_EVENT_LIMIT="30"
LFM_CI_LIMIT="30"
LFMSINK_LIMIT="30"
LNRM_LIMIT=30
LGSDM_LIMIT=30
ADS_LIMIT=30
ADC_LIMIT=30
ADSCONTROLLER_LIMIT=30
UNIXTIME_20=$(date +%s -d '20 minute ago')
#OTV
if [ $OS_Version == "7.5.1804" ]; then
#CiGLBServer
if [ -d /var/log/castis/glb_log ]; then
LOG_FILE=$(ls -ltr /var/log/castis/glb_log/GLB.log 2>/dev/null)
if [ ! -f "$LOG_FILE" ]; then
Make_Json_List Middle "" "CiGLBServer 동작 확인" "LOG 파일 없음" "CiGLBServer: $LOG_FILE 파일 없음" "GLB 로그파일 여부 점검필요" "$Fail"
else
GLB_CI_LOG=$(egrep -ic "error|Fail" "$LOG_FILE")
if [ "$GLB_CI_LOG" -ge "$GLB_LIMIT" ]; then
Make_Json_List Middle "" "CiGLBServer 동작 확인" "Fail 또는 Error 있음" "CiGLBServer: $LOG_FILE 'error|fail'" "점검필요" "$Fail"
else
Make_Json_List Middle "" "CiGLBServer 동작 확인" "Fail 또는 Error 없음" "CiGLBServer: $LOG_FILE 'error|fail'" "이상없음" "$Success"
fi
fi
else
Make_Json_List Middle "" "CiGLBServer 동작 확인" "디렉터리 없음" "CiGLBServer: /var/log/castis/glb_log 디렉터리 없음" "디렉터리 여부 점검필요" "$Fail"
fi
#LoadBalancer2
if [ -d /var/log/castis/lb_log ]; then
LOG_FILES="/var/log/castis/lb_log/LoadBalancer2.log 2>/dev/null"
if [ -z "$LOG_FILES" ]; then
Make_Json_List End "" "LoadBalancer2 동작 확인" "LOG 파일 없음" "LoadBalancer2: /var/log/castis/lb_log 파일 없음" "LoadBalancer2.log 로그파일 여부 점검필요" "$Fail"
else
LB_CI_LOG=$(egrep -i "error|Fail" $LOG_FILES | grep -vc "LimitCacheContent list" | awk -F':' '{ sum += $2 } END { print sum }')
LB_EVENT_LOG=$(egrep -ic "error|Fail" /var/log/castis/lb_log/EventLog[$EVENTLOG_DAY].log 2>/dev/null || echo 0)
if [ $LB_CI_LOG -ge $LB_CI_LIMIT ] || [ $LB_EVENT_LOG -ge $LB_EVENT_LIMIT ]; then
Make_Json_List End "" "LoadBalancer2 동작 확인" "Fail 또는 Error 있음" "LoadBalancer2: /var/log/castis/lb_log/LoadBalancer2.log 'error|fail'" "LoadBalancer2.log 점검필요" "$Fail"
else
Make_Json_List End "" "LoadBalancer2 동작 확인" "Fail 또는 Error 없음" "LoadBalancer2: /var/log/castis/lb_log/LoadBalancer2.log 'error|fail'" "이상없음" "$Success"
fi
fi
else
Make_Json_List End "" "LoadBalancer2 동작 확인" "디렉터리 없음" "LoadBalancer2: /var/log/castis/lb_log 디렉터리 없음" "디렉터리 여부 점검필요" "$Fail"
fi
else
#LFMServer
if [ -d /var/log/castis/lfm_log ]; then
# 최근 LFMServer.log" 파일 5개 선택택
LOG_FILES=$(ls /var/log/castis/lfm_log/$MONTH/${DAY}* | tail -5 | awk '{ print $NF }' 2>/dev/null)
if [ -z "$LOG_FILES" ]; then
Make_Json_List Middle "" "LFMServer 동작 확인" "LOG 파일 없음" "LFMServer: /var/log/castis/lfm_log/LFMServer.log" "LFMServer.log 로그파일 여부 점검필요" "$Fail"
else
# 선택된 파일에서 에러와 실패 패턴 검색
LFM_CI_LOG=$(egrep -v "Infor|match|Source file" $LOG_FILES | egrep -ic "error|Fail" 2>/dev/null)
if [ $LFM_CI_LOG -ge $LFM_CI_LIMIT ]; then
Make_Json_List Middle "" "LFMServer 동작 확인" "Fail 또는 Error 있음" "LFMServer: /var/log/castis/lfm_log/LFMServer.log 'error|fail'" "LFMServer.log 점검필요" "$Fail"
else
Make_Json_List Middle "" "LFMServer 동작 확인" "Fail 또는 Error 없음" "LFMServer: /var/log/castis/lfm_log/LFMServer.log 'error|fail'" "이상없음" "$Success"
fi
fi
else
Make_Json_List Middle "" "LFMServer 동작 확인" "디렉터리 없음" "LFMServer: /var/log/castis/lfm_log 디렉터리 없음" "디렉터리 여부 점검필요" "$Fail"
fi
# LFMSinkModule
if [ -d /var/log/castis/lfmsinkmodule_log ]; then
# 최근 LFMSinkModule.log 파일 5개 선택
LOG_FILES=$(ls /var/log/castis/lfmsinkmodule_log/${MONTH}/${DAY}* | tail -5 | awk '{ print $NF }' 2>/dev/null)
if [ -z "$LOG_FILES" ]; then
Make_Json_List Middle "" "LFMSinkModule 동작 확인" "LOG 파일 없음" "LFMSinkModule: /var/log/castis/lfmsinkmodule_log/LFMSinkModule.log" "LFMSinkModule.log 로그파일 여부 점검필요" "$Fail"
else
LFMSINKMODULE_LOG=$(egrep -ic "error|Fail" $LOG_FILES)
if [ $LFMSINKMODULE_LOG -ge $LFMSINK_LIMIT ]; then
Make_Json_List Middle "" "LFMSinkModule 동작 확인" "Fail 또는 Error 있음" "LFMSinkModule: /var/log/castis/lfmsinkmodule_log/LFMSinkModule.log 'error|fail'" "LFMSinkModule.log 점검필요" "$Fail"
else
Make_Json_List Middle "" "LFMSinkModule 동작 확인" "Fail 또는 Error 없음" "LFMSinkModule: /var/log/castis/lfmsinkmodule_log/EventLog.log 'error|fail'" "이상없음" "$Success"
fi
fi
else
Make_Json_List Middle "" "LFMSinkModule 동작 확인" "디렉터리 없음" "LFMSinkModule: /var/log/castis/lfmsinkmodule_log 디렉터리 없음" "디렉터리 여부 점검필요" "$Fail"
fi

# CiGLBServer
if [ -d /var/log/castis/glb_log ]; then
LOG_FILE="/var/log/castis/glb_log/GLB.log"
if [ -z "$LOG_FILES" ]; then
Make_Json_List Middle "" "CiGLBServer 동작 확인" "LOG 파일 없음" "CiGLBServer: $LOG_FILE 파일 없음" "GLB 로그파일 여부 점검필요" "$Fail"
else
GLB_CI_LOG=$(egrep -ic "error|Fail" $LOG_FILES)
if [ $GLB_CI_LOG -ge $GLB_LIMIT ]; then
Make_Json_List Middle "" "CiGLBServer 동작 확인" "Fail 또는 Error 없음" "CiGLBServer: /var/log/castis/glb_log/EventLog.log 'error|fail'" "점검필요" "$Fail"
else
Make_Json_List Middle "" "CiGLBServer 동작 확인" "Fail 또는 Error 없음" "CiGLBServer: /var/log/castis/glb_log/EventLog.log 'error|fail'" "이상없음" "$Success"
fi
fi
else
Make_Json_List Middle "" "CiGLBServer 동작 확인" "디렉터리 없음" "CiGLBServer: /var/log/castis/glb_log 디렉터리 없음" "디렉터리 여부 점검필요" "$Fail"
fi

# L_ADS
if [ -d /var/log/castis/L_ads_log ]; then
LOG_FILES=$(ls /var/log/castis/L_ads_log/${MONTH}/${DAY}* 2>/dev/null)
if [ -z "$LOG_FILES" ]; then
Make_Json_List Middle "" "L_ADS 동작 확인" "LOG 파일 없음" "L_ADS: /var/log/castis/L_ads_log/EventLog.log" "Event 로그파일 여부 점검필요" "$Fail"
else
ADS_LOG=$(egrep -v "Infor" $LOG_FILES | egrep -ic "error|Fail")
if [ $ADS_LOG -ge $ADS_LIMIT ]; then
Make_Json_List Middle "" "L_ADS 동작 확인" "Fail 또는 Error 없음" "L_ADS: /var/log/castis/L_ads_log/EventLog.log 'error|fail'" "점검필요" "$Fail"
else
Make_Json_List Middle "" "L_ADS 동작 확인" "Fail 또는 Error 없음" "L_ADS: /var/log/castis/L_ads_log/EventLog.log 'error|fail'" "이상없음" "$Success"
fi
fi
else
Make_Json_List Middle "" "L_ADS 동작 확인" "디렉터리 없음" "L_ADS: /var/log/castis/L_ads_log 디렉터리 없음" "디렉터리 여부 점검필요" "$Fail"
fi

# ADSController
if [ -d /var/log/castis/adscontroller_log ]; then
LOG_FILES=$(ls /var/log/castis/adscontroller_log/$MONTH/${DAY}* 2>/dev/null)
if [ -z "$LOG_FILES" ]; then
Make_Json_List Middle "" "ADSController 동작 확인" "LOG 파일 없음" "ADSController: /var/log/castis/adscontroller_log/EventLog.log" "Event 로그파일 여부 점검필요" "$Fail"
else
ADSCONTROLLER_LOG=$(egrep -v "Infor" $LOG_FILES | egrep -ic "error|Fail")
if [ $ADSCONTROLLER_LOG -ge $ADSCONTROLLER_LIMIT ]; then
Make_Json_List Middle "" "ADSController 동작 확인" "Fail 또는 Error 없음" "ADSController: /var/log/castis/adscontroller_log/EventLog.log 'error|fail'" "EventLog.log 점검필요" "$Fail"
else
Make_Json_List Middle "" "ADSController 동작 확인" "Fail 또는 Error 없음" "ADSController: /var/log/castis/adscontroller_log/EventLog.log 'error|fail'" "이상없음" "$Success"
fi
fi
else
Make_Json_List Middle "" "ADSController 동작 확인" "디렉터리 없음" "ADSController: /var/log/castis/adscontroller_log 디렉터리 없음" "디렉터리 여부 점검필요" "$Fail"
fi

# ADSClient
if [ -d /var/log/castis/adc_log ]; then
LOG_FILES=$(ls /var/log/castis/adc_log/$MONTH/${DAY}* 2>/dev/null)
if [ -z "$LOG_FILES" ]; then
Make_Json_List Middle "" "ADSClient 동작 확인" "LOG 파일 없음" "ADSClient: /var/log/castis/adc_log/ADSClient.log " "ADSClient.log 로그파일 여부 점검필요" "$Fail"
else
ADC_LOG=$(egrep -v "Infor" $LOG_FILES | egrep -ic "error|Fail")
if [ $ADC_LOG -ge $ADC_LIMIT ]; then
Make_Json_List Middle "" "ADSClient 동작 확인" "Fail 또는 Error 없음" "ADSClient: /var/log/castis/adc_log/EADSClient.log 'error|fail'" "ADSClient.log 점검필요" "$Fail"
else
Make_Json_List Middle "" "ADSClient 동작 확인" "Fail 또는 Error 없음" "ADSClient: /var/log/castis/adc_log/ADSClient.log 'error|fail'" "이상없음" "$Success"
fi
fi
else
Make_Json_List Middle "" "ADSClient 동작 확인" "디렉터리 없음" "ADSClient: /var/log/castis/adc_log 디렉터리 없음" "디렉터리 여부 점검필요" "$Fail"
fi

# LoadBalancer2
if [ -d /var/log/castis/lb_log ]; then
LOG_FILES="/var/log/castis/lb_log/LoadBalancer2.log"
if [ -z "$LOG_FILES" ]; then
Make_Json_List End "" "LoadBalancer2 동작 확인" "LOG 파일 없음" "LoadBalancer2: /var/log/castis/lb_log/LoadBalancer2.log" "LoadBalancer2.log 로그파일 여부 점검필요" "$Fail"
else
LB_CI_LOG=$(egrep -i "error|Fail" $LOG_FILES | grep -vc "LimitCacheContent list")
LB_EVENT_LOG=$(egrep -ic "error|Fail" /var/log/castis/lb_log/EventLog[$EVENTLOG_DAY].log 2>/dev/null || echo 0)

if [ $LB_CI_LOG -ge $LB_CI_LIMIT ]; then
Make_Json_List End "" "LoadBalancer2 동작 확인" "Fail 또는 Error 있음" "LoadBalancer2: /var/log/castis/lb_log/LoadBalancer2.log 'error|fail'" "LoadBalancer2.log 점검필요" "$Fail"
else
Make_Json_List End "" "LoadBalancer2 동작 확인" "Fail 또는 Error 없음" "LoadBalancer2: /var/log/castis/lb_log/LoadBalancer2.log 'error|fail'" "이상없음" "$Success"
fi
fi
else
Make_Json_List End "" "LoadBalancer2 동작 확인" "디렉터리 없음" "LoadBalancer2: /var/log/castis/lb_log 디렉터리 없음" "디렉터리 여부 점검필요" "$Fail"
fi
fi
fi

else
VOD_LIMIT=50
NOMEDIA_RESET_LOG_LIMIT=200000

if [ -e "/var/log/castis/vod_log/EventLog[$EVENTLOG_DAY].log" ]; then
EVENT_VOD_NOMEDIA_RESET_LOG=$(grep "No Media" $(ls -ltr /var/log/castis/vod_log/${MONTH}/${DAY}* | awk '{ print $NF }') | grep ted | awk -F '[' '{ split($2,arr,"]"); sum+=arr[1] } END{print sum}')
EVENT_VOD_ERR_LOG=$(egrep -i "Error|Fail|Invalid File.*mpg" /var/log/castis/vod_log/EventLog[$EVENTLOG_DAY].log | egrep -v "OnHTTPGet Fail|Invalid URL. SETUP Fail|RTSP Message Parsing Error|Invalid|AsyncIO Error" | wc -l)
else
EVENT_VOD_NOMEDIA_RESET_LOG=0
EVENT_VOD_ERR_LOG=0
fi
i=0

if [ $EVENT_VOD_ERR_LOG -ge $VOD_LIMIT ]; then
Service_Streaming_Status_Array[$i]="VOD ERROR로그 $VOD_LIMIT건 이상 발생"
((i++))
fi

if [ $EVENT_VOD_NOMEDIA_RESET_LOG -ge $NOMEDIA_RESET_LOG_LIMIT ]; then
Service_Streaming_Status_Array[$i]="VOD No Media로그 $EVENT_VOD_NOMEDIA_RESET_LOG건 이상 발생"
fi 2>/dev/null

if [ ${#Service_Streaming_Status_Array[@]} -ge 1 ]; then
Make_Json_List End "" "CIHVODServer 동작 확인" "Fail 또는 Error 없음" "'No Media|error|fail'" "${Service_Streaming_Status_Array[@]}" "$Fail"
else
Make_Json_List End "" "CIHVODServer 동작 확인" "Fail 또는 Error 없음" "'No Media|error|fail'" "이상없음" "$Success"
fi

fi

}

#local functions end
case $1 in
\? | -h)
f_Usage
exit
;;
esac

#Json start

case $2 in
LSM | ADC)
HW_Check
Network_Check
OS_Check $2
Cluster_Check
Service_Solution_Status_Check $2 $?

hw_result=$(HW_Check)
network_result=$(Network_Check)
os_result=$(OS_Check $2)
cluster_result=$(Cluster_Check)
service_solution_result=$(Service_Solution_Status_Check $2 $?)

all_results="$hw_result\n$network_result\n$os_result\n$cluster_result\n$service_solution_result"
;;
VOD)
HW_Check
Network_Check
OS_Check $2
Service_Solution_Status_Check $2

hw_result=$(HW_Check)
network_result=$(Network_Check)
os_result=$(OS_Check $2)
service_result=$(Service_Solution_Status_Check $2)

all_results="$hw_result\n$network_result\n$os_result\n$service_result"
;;

esac

# 결과 중 "점검필요", "불량", "이상 발생" 텍스트가 있어야 수집
if echo -e "$all_results" | grep -E -q "점검필요|불량|이상 발생"; then
echo -e "\n[점검필요 항목]"
echo -e "$all_results" | grep -E -q "점검필요|불량|이상 발생"
echo -e "$all_results" | awk '/점검 내용/ {content=$0} /상태:/ && /점검필요/ {print content; print $0; print ""}'
else
echo -e "\n모든 항목이 이상없음 상태입니다."
fi